package com.ucode.model.hrm;

import com.ucode.tool.base.BaseTenantMode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.math.BigDecimal;
import java.time.LocalDate;

/**
 * 员工费用明细宽表实体类
 * @Author: liliang
 * @Date: 2025/7/18 22:32
 * @Version: 1.0
 */
@Schema(description = "人力资源管理系统 - 员工费用明细")
@Data
@EqualsAndHashCode
@ToString(callSuper = true)
public class HrmEmployeeCostDetail extends BaseTenantMode<Long,Long> {
    /**
     * 批次号
     */
    private String batchnum;
    /**
     * 费用类型：1: '员工费用', 2: '补缴社保'
     */
    private Integer costType;
    /**
     * 公司ID
     */
    private Long companyId;
    /**
     * 项目ID
     */
    private Long projectId;
    /**
     * 员工ID
     */
    private Long employeeId;

    /** 姓名 */
    private String employeeName;

    /** 身份证号 */
    private String idCard;

    /** 入职日期 */
    private LocalDate entryDate;

    /** 在职地区 */
    private String workArea;

    /** 费用月份（存储当月1号） */
    private LocalDate feeMonth;

    /** 月数 */
    private Integer months;

    // --- 社保基数部分 ---

    /** 养老基数 */
    private BigDecimal pensionBase = BigDecimal.ZERO;

    /** 医疗基数 */
    private BigDecimal medicalBase = BigDecimal.ZERO;

    /** 失业基数 */
    private BigDecimal unemploymentBase = BigDecimal.ZERO;

    /** 工伤基数 */
    private BigDecimal injuryBase = BigDecimal.ZERO;

    /** 生育基数 */
    private BigDecimal maternityBase = BigDecimal.ZERO;

    /** 大病医疗基数 */
    private BigDecimal unitSeriousMedicalBase = BigDecimal.ZERO;

    /** 残保金基数 */
    private BigDecimal unitDisabilityInsuranceBase = BigDecimal.ZERO;

    /** 长期护照险基数 */
    private BigDecimal longTermPassportInsuranceBase = BigDecimal.ZERO;

    // --- 单位社保部分 ---

    // 养老保险比例（单位）
    private BigDecimal pensionUnitRatio = BigDecimal.ZERO;
    /** 养老-单位缴纳金额 */
    private BigDecimal unitPension = BigDecimal.ZERO;

    // 失业保险比例（单位）
    private BigDecimal unemploymentUnitRatio = BigDecimal.ZERO;
    /** 失业-单位缴纳金额 */
    private BigDecimal unitUnemployment = BigDecimal.ZERO;

    // 工伤保险比例（单位）
    private BigDecimal injuryUnitRatio = BigDecimal.ZERO;
    /** 工伤-单位缴纳金额 */
    private BigDecimal unitInjury = BigDecimal.ZERO;

    // 生育保险比例（单位）
    private BigDecimal maternityUnitRatio = BigDecimal.ZERO;
    /** 生育-单位缴纳金额 */
    private BigDecimal unitMaternity = BigDecimal.ZERO;

    // 医疗保险比例（单位）
    private BigDecimal medicalUnitRatio = BigDecimal.ZERO;
    /** 医疗-单位缴纳金额 */
    private BigDecimal unitMedical = BigDecimal.ZERO;

    // 大病医疗比例（单位）
    private BigDecimal seriousMedicalUnitRatio = BigDecimal.ZERO;
    /** 大病医疗-单位缴纳金额 */
    private BigDecimal unitSeriousMedical = BigDecimal.ZERO;

    // 残保金比例（单位）
    private BigDecimal unitDisabilityInsuranceRatio = BigDecimal.ZERO;
    /** 残保金-单位缴纳金额 */
    private BigDecimal unitDisabilityInsurance = BigDecimal.ZERO;

    /** 单位社保小计 */
    private BigDecimal unitSocialSubtotal = BigDecimal.ZERO;

    // --- 个人社保部分 ---
    // 养老保险比例（个人）
    private BigDecimal pensionIndividualRatio = BigDecimal.ZERO;
    /** 养老-个人缴纳金额 */
    private BigDecimal individualPension = BigDecimal.ZERO;


    // 失业保险比例（个人）
    private BigDecimal unemploymentIndividualRatio = BigDecimal.ZERO;
    /** 失业-个人缴纳金额 */
    private BigDecimal individualUnemployment = BigDecimal.ZERO;

    // 医疗保险比例（个人）
    private BigDecimal medicalIndividualRatio = BigDecimal.ZERO;
    /** 医疗-个人缴纳金额 */
    private BigDecimal individualMedical = BigDecimal.ZERO;

    // 大病医疗比例（个人）
    private BigDecimal largeMedicalIndividualRatio = BigDecimal.ZERO;
    /** 大额医疗-个人缴纳金额 */
    private BigDecimal individualLargeMedical = BigDecimal.ZERO;

    // 长期护照险比例（个人）
    private BigDecimal longTermPassportInsuranceRatio = BigDecimal.ZERO;
    /** 长期护照险-个人缴纳金额 */
    private BigDecimal longTermPassportInsurance = BigDecimal.ZERO;

    /** 个人社保小计 */
    private BigDecimal individualSocialSubtotal = BigDecimal.ZERO;

    /** 社保合计（单位+个人） */
    private BigDecimal totalSocialSecurity = BigDecimal.ZERO;

    // --- 公积金部分 ---
    /** 公积金缴纳月份（存储当月1号） */
    private LocalDate housingFundMonth ;

    /** 公积金缴纳基数 */
    private BigDecimal housingFundBase = BigDecimal.ZERO;

    /** 单位：公积金缴纳比例 */
    private BigDecimal unitHousingFundRate = BigDecimal.ZERO;

    /** 公积金单位缴纳金额 */
    private BigDecimal unitHousingFund = BigDecimal.ZERO;

    /** 个人：公积金缴纳比例 */
    private BigDecimal individualHousingFundRate = BigDecimal.ZERO;

    /** 公积金个人缴纳金额 */
    private BigDecimal individualHousingFund = BigDecimal.ZERO;

    /** 公积金合计（单位+个人） */
    private BigDecimal totalHousingFund = BigDecimal.ZERO;

    // --- 工资明细部分 ---
    /** 基本工资 */
    private BigDecimal baseSalary = BigDecimal.ZERO;

    /** 岗位工资 */
    private BigDecimal positionSalary = BigDecimal.ZERO;

    /** 地区差异津贴 */
    private BigDecimal regionalDifference = BigDecimal.ZERO;

    /** 交通补贴 */
    private BigDecimal trafficSubsidy = BigDecimal.ZERO;

    /** 通讯补贴 */
    private BigDecimal communicationSubsidy = BigDecimal.ZERO;

    /** 加班工资 */
    private BigDecimal overtimeSalary = BigDecimal.ZERO;

    /** 专业技术津贴 */
    private BigDecimal professionalAllowance = BigDecimal.ZERO;

    /** 综合补贴 */
    private BigDecimal comprehensiveSubsidy = BigDecimal.ZERO;

    /** 工资补发 */
    private BigDecimal salaryReissue = BigDecimal.ZERO;

    /** 报销金额 */
    private BigDecimal reimbursement = BigDecimal.ZERO;

    /** 提成金额 */
    private BigDecimal commission = BigDecimal.ZERO;

    /** 应发合计 */
    private BigDecimal totalPayable = BigDecimal.ZERO;

    // --- 扣款项部分 ---
    /** 社保个人扣除部分 */
    private BigDecimal socialSecurityDeduction = BigDecimal.ZERO;

    /** 公积金个人扣除部分 */
    private BigDecimal housingFundDeduction = BigDecimal.ZERO;

    /** 个人所得税 */
    private BigDecimal individualIncomeTax = BigDecimal.ZERO;

    // --- 结算部分 ---
    /** 实发工资 */
    private BigDecimal netSalary = BigDecimal.ZERO;

    /** 小计（工资小计） */
    private BigDecimal subtotal = BigDecimal.ZERO;

    /** 服务费 */
    private BigDecimal serviceFee = BigDecimal.ZERO;

    /** 节假日福利 */
    private BigDecimal holidayBenefits = BigDecimal.ZERO;

    /** 费用合计（最终成本总额） */
    private BigDecimal totalCost = BigDecimal.ZERO;

}
